{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "import copy\n",
    "import pandas as pd\n",
    "import torch\n",
    "from torch.autograd import Variable\n",
    "from densenet import densenet169\n",
    "from utils import plot_training, n_p, get_count\n",
    "from train import train_model, get_metrics\n",
    "from pipeline import get_study_level_data, get_dataloaders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████| 587/587 [00:01<00:00, 402.26it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 132/132 [00:00<00:00, 344.67it/s]\n"
     ]
    }
   ],
   "source": [
    "study_data = get_study_level_data(study_type='XR_HUMERUS')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_cat = ['train', 'valid'] # data categories\n",
    "dataloaders = get_dataloaders(study_data, batch_size=1)\n",
    "dataset_sizes = {x: len(study_data[x]) for x in data_cat}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "tai = {x: get_count(study_data[x], 'positive') for x in data_cat}\n",
    "tni = {x: get_count(study_data[x], 'negative') for x in data_cat}\n",
    "Wt1 = {x: n_p(tni[x] / (tni[x] + tai[x])) for x in data_cat}\n",
    "Wt0 = {x: n_p(tai[x] / (tni[x] + tai[x])) for x in data_cat}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tai: {'train': 599, 'valid': 140}\n",
      "tni: {'train': 673, 'valid': 148} \n",
      "\n",
      "Wt0 train: tensor([0.4709], device='cuda:0')\n",
      "Wt0 valid: tensor([0.4861], device='cuda:0')\n",
      "Wt1 train: tensor([0.5291], device='cuda:0')\n",
      "Wt1 valid: tensor([0.5139], device='cuda:0')\n"
     ]
    }
   ],
   "source": [
    "print('tai:', tai)\n",
    "print('tni:', tni, '\\n')\n",
    "print('Wt0 train:', Wt0['train'])\n",
    "print('Wt0 valid:', Wt0['valid'])\n",
    "print('Wt1 train:', Wt1['train'])\n",
    "print('Wt1 valid:', Wt1['valid'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Loss(torch.nn.modules.Module):\n",
    "    def __init__(self, Wt1, Wt0):\n",
    "        super(Loss, self).__init__()\n",
    "        self.Wt1 = Wt1\n",
    "        self.Wt0 = Wt0\n",
    "        \n",
    "    def forward(self, inputs, targets, phase):\n",
    "        loss = - (self.Wt1[phase] * targets * inputs.log() + self.Wt0[phase] * (1 - targets) * (1 - inputs).log())\n",
    "        return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\doshi\\New project\\densenet.py:115: UserWarning: nn.init.kaiming_normal is now deprecated in favor of nn.init.kaiming_normal_.\n",
      "  nn.init.kaiming_normal(m.weight.data)\n"
     ]
    }
   ],
   "source": [
    "model = densenet169(pretrained=True)\n",
    "model = model.cuda()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "criterion = Loss(Wt1, Wt0)\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)\n",
    "scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', patience=1, verbose=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train batches: 592\n",
      "Valid batches: 135 \n",
      "\n",
      "Epoch 1/10\n",
      "----------\n",
      "0\r"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\doshi\\Anaconda3\\envs\\test\\lib\\site-packages\\torch\\nn\\functional.py:1332: UserWarning: nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\n",
      "  warnings.warn(\"nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\")\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train Loss: 0.3454 Acc: 0.5287\n",
      "Confusion Meter:\n",
      " [[ 0.56697822  0.43302181]\n",
      " [ 0.51660514  0.48339483]]\n",
      "valid Loss: 0.4008 Acc: 0.5630\n",
      "Confusion Meter:\n",
      " [[ 0.57352942  0.42647058]\n",
      " [ 0.44776121  0.55223882]]\n",
      "Time elapsed: 4m 29s\n",
      "\n",
      "Epoch 2/10\n",
      "----------\n",
      "train Loss: 0.3427 Acc: 0.5507\n",
      "Confusion Meter:\n",
      " [[ 0.56697822  0.43302181]\n",
      " [ 0.46863469  0.53136533]]\n",
      "valid Loss: 0.3737 Acc: 0.5704\n",
      "Confusion Meter:\n",
      " [[ 0.57352942  0.42647058]\n",
      " [ 0.43283582  0.56716418]]\n",
      "Time elapsed: 8m 51s\n",
      "\n",
      "Epoch 3/10\n",
      "----------\n",
      "train Loss: 0.3454 Acc: 0.5101\n",
      "Confusion Meter:\n",
      " [[ 0.63551402  0.36448598]\n",
      " [ 0.63837636  0.36162362]]\n",
      "valid Loss: 0.5199 Acc: 0.4963\n",
      "Confusion Meter:\n",
      " [[ 0.54411763  0.45588234]\n",
      " [ 0.55223882  0.44776121]]\n",
      "Time elapsed: 13m 11s\n",
      "\n",
      "Epoch 4/10\n",
      "----------\n",
      "train Loss: 0.3358 Acc: 0.5912\n",
      "Confusion Meter:\n",
      " [[ 0.61682242  0.38317758]\n",
      " [ 0.43911439  0.56088561]]\n",
      "valid Loss: 0.5316 Acc: 0.5259\n",
      "Confusion Meter:\n",
      " [[ 0.54411763  0.45588234]\n",
      " [ 0.49253732  0.50746268]]\n",
      "Epoch     3: reducing learning rate of group 0 to 1.0000e-05.\n",
      "Time elapsed: 17m 30s\n",
      "\n",
      "Epoch 5/10\n",
      "----------\n",
      "train Loss: 0.3283 Acc: 0.6655\n",
      "Confusion Meter:\n",
      " [[ 0.80996883  0.19003116]\n",
      " [ 0.50553507  0.49446493]]\n",
      "valid Loss: 0.4524 Acc: 0.5259\n",
      "Confusion Meter:\n",
      " [[ 0.58823532  0.41176471]\n",
      " [ 0.53731346  0.46268657]]\n",
      "Time elapsed: 21m 49s\n",
      "\n",
      "Epoch 6/10\n",
      "----------\n",
      "train Loss: 0.3207 Acc: 0.6605\n",
      "Confusion Meter:\n",
      " [[ 0.69781929  0.30218068]\n",
      " [ 0.38376385  0.61623615]]\n",
      "valid Loss: 0.4357 Acc: 0.5481\n",
      "Confusion Meter:\n",
      " [[ 0.44117647  0.55882353]\n",
      " [ 0.34328359  0.65671641]]\n",
      "Epoch     5: reducing learning rate of group 0 to 1.0000e-06.\n",
      "Time elapsed: 26m 10s\n",
      "\n",
      "Epoch 7/10\n",
      "----------\n",
      "train Loss: 0.3128 Acc: 0.6993\n",
      "Confusion Meter:\n",
      " [[ 0.78816199  0.21183801]\n",
      " [ 0.40590405  0.59409595]]\n",
      "valid Loss: 0.4174 Acc: 0.5704\n",
      "Confusion Meter:\n",
      " [[ 0.54411763  0.45588234]\n",
      " [ 0.40298507  0.5970149 ]]\n",
      "Time elapsed: 30m 30s\n",
      "\n",
      "Epoch 8/10\n",
      "----------\n",
      "train Loss: 0.3124 Acc: 0.6926\n",
      "Confusion Meter:\n",
      " [[ 0.75389409  0.24610592]\n",
      " [ 0.38007382  0.61992621]]\n",
      "valid Loss: 0.3983 Acc: 0.5481\n",
      "Confusion Meter:\n",
      " [[ 0.61764705  0.38235295]\n",
      " [ 0.52238804  0.47761193]]\n",
      "Epoch     7: reducing learning rate of group 0 to 1.0000e-07.\n",
      "Time elapsed: 34m 49s\n",
      "\n",
      "Epoch 9/10\n",
      "----------\n",
      "train Loss: 0.3113 Acc: 0.7061\n",
      "Confusion Meter:\n",
      " [[ 0.75389409  0.24610592]\n",
      " [ 0.35055351  0.64944649]]\n",
      "valid Loss: 0.4147 Acc: 0.5481\n",
      "Confusion Meter:\n",
      " [[ 0.69117647  0.30882353]\n",
      " [ 0.5970149   0.40298507]]\n",
      "Time elapsed: 39m 9s\n",
      "\n",
      "Epoch 10/10\n",
      "----------\n",
      "train Loss: 0.3100 Acc: 0.7111\n",
      "Confusion Meter:\n",
      " [[ 0.76947039  0.23052959]\n",
      " [ 0.35793358  0.64206642]]\n",
      "valid Loss: 0.4147 Acc: 0.5481\n",
      "Confusion Meter:\n",
      " [[ 0.47058824  0.52941179]\n",
      " [ 0.37313432  0.62686568]]\n",
      "Epoch     9: reducing learning rate of group 0 to 1.0000e-08.\n",
      "Time elapsed: 43m 28s\n",
      "\n",
      "Training complete in 43m 28s\n",
      "Best valid Acc: 0.570370\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x15b7ab2add8>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = train_model(model, criterion, optimizer, dataloaders, scheduler, dataset_sizes, num_epochs=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.save(model.state_dict(), 'C:/Users/doshi/New project/model.pth')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\r"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\doshi\\Anaconda3\\envs\\test\\lib\\site-packages\\torch\\nn\\functional.py:1332: UserWarning: nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\n",
      "  warnings.warn(\"nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\")\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "valid Loss: 0.7856 Acc: 0.5704\n",
      "Confusion Meter:\n",
      " [[ 0.57352942  0.42647058]\n",
      " [ 0.43283582  0.56716418]]\n"
     ]
    }
   ],
   "source": [
    "get_metrics(model, criterion, dataloaders, dataset_sizes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (myenv)",
   "language": "python",
   "name": "myenv"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
